home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / pao / towns / cdplay / src / cdpn.c < prev    next >
Text File  |  1991-10-18  |  62KB  |  1,897 lines

  1. /* << High C V1.4 >> **********************************************************
  2. **
  3. **    CD 演奏ライブラリを使用した CD PLAYER
  4. **
  5. **    1991.03.19 : CREATE
  6. **    1991.03.23 : FINISH
  7. **
  8. **    < HISTORY >
  9. **    1991.03.19 : CREATE
  10. **    1991.03.25 : PROGRAM演奏モードのままCDを入れ換えた時に、未選択合計時間
  11. **                 の値がおかしくなるのを修正. 再表示していなかったのを修正.
  12. **    1991.03.27 : プログラムモード時のダビング支援用テープ選択および曲選択の機能追加.
  13. **
  14. **    < note > : TABS = 4
  15. **
  16. **    All Rights Reserved, Copyright (C) Y.Hirata 1991.
  17. **
  18. **    Programmed by Y.Hirata ( Nifty ID : NAB03321 )
  19. **
  20. ******************************************************************************/
  21.  
  22. /*-----------------------------------------------------------------------------
  23. **    CDDA.LIB 使用上の注意事項
  24. **
  25. **    1.
  26. **    ヘッダファイル CDDA.H をインクルードして下さい. CDR.H はインクルードする必要ありません.
  27. **
  28. **    2.
  29. **    使用する関数は、CDDA_switch() だけです.
  30. **    PAUSE中とかに、別関数を使用して PAUSE/STOP した場合に、続きの処理が保証
  31. **    されません.
  32. **
  33. **    3.
  34. **    LINK時には、CDDA.LIB の他に CDR.LIB もLINKして下さい.
  35. **    また、LINKオプション -CALLBUFS に 2 以上の値を指定して下さい.
  36. **    TWOCASE でLINKして下さい.
  37. -----------------------------------------------------------------------------*/
  38.  
  39. #include <stdio.h>
  40. #include <stdlib.h>
  41. #include <string.h>
  42. #include <egb.h>
  43. #include <mos.h>
  44. #include <snd.h>
  45. #include <fmc.h>
  46. #include "grp.h"
  47. #include "mostype.h"
  48. #include "elevol.h"
  49. #include "sndplay.h"
  50. #include "key.h"
  51. #include "tape.h"
  52.  
  53. #define    _CDPN_MAIN
  54. #include "cdpn.h"
  55.  
  56. /*-----------------------------------------------------------------------------
  57. **    いわゆる隠し機能に相当します♪
  58. -----------------------------------------------------------------------------*/
  59. extern char    CDDA_FLG_stop ;                    /*  プログラム終了時にSTOPする?    */
  60.  
  61. /*-----------------------------------------------------------------------------
  62. **    時間監視用に タイマ 割り込みを使用します.
  63. -----------------------------------------------------------------------------*/
  64. unsigned    Timeno ;                        /*  タイマ管理番号                    */
  65.  
  66. /*-----------------------------------------------------------------------------
  67. **    CTRL+C を マスク するのに使用します.
  68. -----------------------------------------------------------------------------*/
  69. extern void int24_mask( void ) ;
  70.  
  71. /*-----------------------------------------------------------------------------
  72. **    プログラム起動時のオプションで使用します.
  73. -----------------------------------------------------------------------------*/
  74. char    Startplay = FALSE ;                    /*  プログラム開始時にPLAYする?    */
  75.  
  76. /*-----------------------------------------------------------------------------
  77. **    停止中/NOT READY中の未アクセスチェックに使用します.
  78. -----------------------------------------------------------------------------*/
  79. char    Noaflg = FALSE ;                    /*  停止中にアクセスしたか?        */
  80.  
  81. /******************************  TIMER Handler  ******************************/
  82. static int timer_func( void )
  83. /*=============================================================================
  84. **    タイマ 割り込み ハンドラ
  85. **
  86. **    < INPUT  > : なし
  87. **    < OUTPUT > : なし
  88. **    < RETURN > : 0
  89. =============================================================================*/
  90. {
  91.     Tcount1 ++ ;
  92.     Tcount2 ++ ;
  93.     Tcount3 ++ ;
  94.     return( 0 ) ;
  95. }
  96.  
  97. /******************************  パレット初期化  ********************************/
  98. void palinit( void )
  99. /*=============================================================================
  100. **    16 色 パレット の初期化を行う.
  101. **
  102. **    < INPUT  > : なし
  103. **    < OUTPUT > : なし
  104. **    < RETURN > : なし
  105. =============================================================================*/
  106. {
  107.     char    para[132] ;
  108.     int        c ;
  109.  
  110.     DWORD( para+0 ) = 16 ;                            /*  登録数    */
  111.     for ( c=0; c<16; c++ ) {
  112.         DWORD( para+ 4+c*8 ) = c ;                    /*  NUMBER    */
  113.         BYTE(  para+ 8+c*8 ) = Palette[c][0] ;        /*  BLUE    */
  114.         BYTE(  para+ 9+c*8 ) = Palette[c][1] ;        /*  RED        */
  115.         BYTE(  para+10+c*8 ) = Palette[c][2] ;        /*  GREEN    */
  116.         BYTE(  para+11+c*8 ) = 0 ;                    /*  NULL    */
  117.     }
  118.     EGB_palette( Gwork,0,para ) ;
  119. }
  120.  
  121. /****************************  タイマ割り込み初期化  ****************************/
  122. void timer_init( void )
  123. /*=============================================================================
  124. **    タイマ 割り込みの登録を行う.
  125. **
  126. **    < INPUT  > : なし
  127. **    < OUTPUT > : なし
  128. **    < RETURN > : なし
  129. =============================================================================*/
  130. {
  131.     TIM_TIME timer ;
  132.  
  133.     Tcount1 = 0 ;                                    /*  CDC ウェイト用            */
  134.     Tcount2 = 0 ;                                    /*  時間表示制御用        */
  135.     Tcount3 = 0 ;                                    /*  未アクセス時間チェック用    */
  136.  
  137.     timer.mode = 0 ;                                /*  インターバルモード        */
  138.     timer.inf  = 0 ;                                /*  割り込みモード    */
  139.     BSETCODEADR( (char *)&timer.adr,timer_func ) ;
  140.     timer.hcycle = 0x00 ;
  141.     timer.lcycle = 2 ;                                /*  20ms            */
  142.     TIM_settime( &timer,(int *)&Timeno ) ;
  143. }
  144.  
  145. /******************************  タイマ割り込み終了  ****************************/
  146. void timer_end( void )
  147. /*=============================================================================
  148. **    タイマ 割り込みの解除を行う.
  149. **
  150. **    < INPUT  > : なし
  151. **    < OUTPUT > : なし
  152. **    < RETURN > : なし
  153. =============================================================================*/
  154. {
  155.     TIM_clrtime( Timeno ) ;
  156. }
  157.  
  158. /********************************  初期化処理  *******************************/
  159. void valinit( void )
  160. /*=============================================================================
  161. **    グローバル変数の初期化を行う.
  162. **
  163. **    < INPUT  > : なし
  164. **    < OUTPUT > : なし
  165. **    < RETURN > : なし
  166. =============================================================================*/
  167. {
  168.     int        c ;
  169.  
  170.     Flg.pause   = FALSE ;
  171.     Flg.repeat  = FALSE ;
  172.     Flg.shuffle = FALSE ;
  173.     Flg.playon  = FALSE ;
  174.     Flg.program = FALSE ;
  175.     Flg.prgchk  = FALSE ;
  176.     Flg.tape    = FALSE ;
  177.     for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
  178.         Prginf[c] = ZERO ;
  179.         Prgcnt[c] = ZERO ;
  180.     }
  181.     XORno       = ZERO ;
  182.     Musicno     = ZERO ;
  183.     Status      = CDDA_STAT_NOTREADY ;
  184.     Dispno = Dispmin = Dispsec = ZERO ;
  185. }
  186.  
  187. /*****************************  マウスの位置設定  *******************************/
  188. void mossetpos( int evno )
  189. /*=============================================================================
  190. **    マウスカーソル を指定された スイッチ の中心に セット する.
  191. **
  192. **    < INPUT  > : イベント番号(SWVAL+スイッチ番号) or 曲番号
  193. **    < OUTPUT > : なし
  194. **    < RETURN > : なし
  195. =============================================================================*/
  196. {
  197.     int        x, y ;
  198.     int        sw ;
  199.  
  200. /*-----------------------------------------------------------------------------
  201. **    evno が SWVALより大きな時には、演奏スイッチの処理である.
  202. -----------------------------------------------------------------------------*/
  203.     if ( evno >= SWVAL ) {
  204.         sw = evno - SWVAL ;
  205.         if ( sw < ZERO || sw >= SWPOINT ) return ;
  206.         x = ( Position[sw].e.x - Position[sw].s.x + 1 ) / 2 +
  207.                 Position[sw].s.x ;
  208.         y = ( Position[sw].e.y - Position[sw].s.y + 1 ) / 2 +
  209.                 Position[sw].s.y ;
  210.         MOS_setpos( x,y ) ;
  211.  
  212. /*-----------------------------------------------------------------------------
  213. **    曲番号指定時の処理
  214. -----------------------------------------------------------------------------*/
  215.     } else {
  216.         if ( ( CDDA_INFO_buf.start <= evno && evno <= CDDA_INFO_buf.end &&
  217.                 !CDDA_data_check( evno ) ) || evno == SW_TOTAL ) {
  218.             x = PSInf.x + ((evno-1)/20)*121 + 1 + 60 ;
  219.             y = (PSInf.y+YCDOT+1) + ((evno-1)%20)*(YCDOT+1) + 1 + 7 ;
  220.             MOS_setpos( x,y ) ;
  221.         }
  222.     }
  223. }
  224.  
  225. /********************************  初期化処理  *******************************/
  226. void init( void )
  227. /*=============================================================================
  228. **    EGB / SND / MOS / 電子ボリューム 等の初期設定を行う.
  229. **
  230. **    < INPUT  > : なし
  231. **    < OUTPUT > : なし
  232. **    < RETURN > : なし
  233. =============================================================================*/
  234. {
  235.     int        c ;
  236.  
  237. /*    TAPE選択の初期設定    */
  238.     TAPE_init() ;
  239.  
  240. /*  EGB 初期設定    */
  241.     EGB_init( Gwork,GworkSize ) ;                /*  EGB初期化                */
  242.     EGB_resolution( Gwork,0,3 ) ;                /*  EGB 16 color            */
  243.     EGB_resolution( Gwork,1,3 ) ;                /*  EGB 16 color            */
  244.     EGB_displayPage( Gwork,1,3 ) ;                /*  show page 0 & 1 : pr 1    */
  245.     EGB_writePage( Gwork,1 ) ;
  246.  
  247. /*    サウンド初期化        */
  248.     SND_init( Swork ) ;
  249.  
  250. /*    マウス 初期設定    */
  251.     MOS_start( Mwork,MworkSize ) ;
  252.     MOS_writePage( 1 ) ;
  253.     MOS_color( 0,C_GREENON ) ;
  254.     mostype( MOSTYPE_STANDARD ) ;
  255.     mossetpos( SW_PLAY+SWVAL ) ;
  256.     dispmouse( FALSE ) ;
  257.  
  258. /*-----------------------------------------------------------------------------
  259. **    電子ボリュームの設定は、あらかじめアプリケーション側で行う必要があります!
  260. -----------------------------------------------------------------------------*/
  261.     SND_pcm_mode_set( 8 ) ;                        /*  PCM音声モードチャンネル数設定    */
  262.  
  263.     SND_elevol_init() ;                            /*  電子ボリューム初期化        */
  264.     ELEVOL_set( ELEVOL_MIC,ZERO,ZERO ) ;        /*  MIC は ミュート                */
  265.     ELEVOL_set( ELEVOL_CD,ELEVOL_MAX+1,ELEVOL_MAX+1 ) ;        /*  CD は MAX    */
  266.     Flg.mute = FALSE ;                            /*  ミュートは解除状態            */
  267.  
  268. /*    パレット 初期化    */
  269.     palinit() ;
  270.  
  271. /*    グローバル変数の初期値設定    */
  272.     for ( c=0; c<SWPOINT; c++ ) Swstat[c] = TRUE ;
  273.     for ( c=0; c<CDDA_MAX_TRACK; c++ ) Infstat[c] = FALSE ;
  274.     Timemode = TM_TR_CLOCK ;
  275.     Playmode = SW_CONTINUE ;
  276.     valinit() ;
  277.     Evol     = ELEVOL_MAX ;
  278. }
  279.  
  280. /*****************************  マウス制御を待つ  *******************************/
  281. void mosloop( int sw,int *mbot,int *mx,int *my )
  282. /*=============================================================================
  283. **    マウス の ボタンクリック が指定された状態になるまで待つ.
  284. **
  285. **    < INPUT  > : sw ボタンクリック状態.
  286. **    < OUTPUT > : mbot - ボタンクリック状態
  287. **               : mx   - マウス水平座標
  288. **               : my   - マウス垂直座標
  289. **    < RETURN > : なし
  290. =============================================================================*/
  291. {
  292.     do {
  293.         MOS_rdpos( mbot,mx,my ) ;
  294.     } while ( *mbot == sw ) ;
  295. }
  296.  
  297. /**************************  TOTAL枠内のマウスクリックチェック  *************************/
  298. int tapeselecton( void )
  299. /*=============================================================================
  300. **    マウスが合計時間枠内でクリックされた時のチェックを行う.
  301. **
  302. **    < INPUT  > : なし
  303. **    < OUTPUT > : なし
  304. **    < RETURN > : 有効ならば、真値, 無効ならば、偽値.
  305. =============================================================================*/
  306. {
  307.     if ( Playmode != SW_PROGRAM )
  308.         return( FALSE ) ;                        /*  プログラム演奏モードでない    */
  309.     if ( Flg.tape )
  310.         return( FALSE ) ;                        /*  既にテープ選択済            */
  311.     if ( CDDA_NOW_status != CDDA_STAT_STOP )
  312.         return( FALSE ) ;                        /*  停止中でない            */
  313.     if ( CDDA_TOTAL_program > ZERO )
  314.         return( FALSE ) ;                        /*  既にプログラム登録曲あり    */
  315.  
  316.     dispselectmusicno( SW_TOTAL ) ;
  317.     return( TRUE ) ;
  318. }
  319.  
  320. /*****************************  マウスイベントのチェック  ******************************/
  321. int mosevent( int *no )
  322. /*=============================================================================
  323. **    マウスがクリックされた時に対応するイベントをチェックする.
  324. **
  325. **    < INPUT  > : なし
  326. **    < OUTPUT > : イベント番号(SWVAL+スイッチ番号) or 曲番号
  327. **    < RETURN > : イベントありならば 真値, イベントなしならば 偽値.
  328. **
  329. **    イベントに対応するスイッチを表示ONにするので、必要に応じて呼び側で表示OFFにする
  330. **    必要があります.
  331. =============================================================================*/
  332. {
  333.     int        mbot, mx, my ;
  334.     int        c ;
  335.  
  336.     MOS_rdpos( &mbot,&mx,&my ) ;
  337.     Mosbot = mbot ;
  338.     Mosx   = mx ;
  339.     Mosy   = my ;
  340.  
  341. /*-----------------------------------------------------------------------------
  342. **    時間表示クリア( 停止時/NOT READY時 )
  343. **
  344. **    プログラム設定曲確認後(一定時間保留後)は表示をクリアする.
  345. **    一定時間経過後の場合には、disptime()にて プログラム確認用ポインタをクリアする.
  346. -----------------------------------------------------------------------------*/
  347.     if ( Flg.prgchk || Tcount2 >= PRG_WAIT ) {
  348.         if ( CDDA_NOW_status != CDDA_STAT_PLAY &&
  349.                 CDDA_NOW_status != CDDA_STAT_PAUSE &&
  350.                 Dispno != -1 ) {
  351.             disptime( ZERO,TM_NODISP ) ;
  352.         }
  353.     }
  354. /*-----------------------------------------------------------------------------
  355. **    曲番号 : 指定された曲番号が有効かどうかチェックし、有効ならば反転表示する.
  356. **
  357. **    無効の場合でも プログラム設定曲確認中(一定時間保留中)には、反転表示の クリア
  358. **    をしない.
  359. -----------------------------------------------------------------------------*/
  360.     if ( PSInf.x < mx && mx < (PSInf.x+604) &&
  361.             (PSInf.y+YCDOT+1) < my && my < (PSInf.y+YCDOT+339) ) {
  362.         c = (mx+103) / 121 - 1 ;
  363.         *no = (my-PSInf.y) / 17 + 20*c ;
  364.         if ( CDDA_INFO_buf.start <= *no && *no <= CDDA_INFO_buf.end &&
  365.                 !CDDA_data_check( *no ) ) {
  366.             dispselectmusicno( *no ) ;
  367.         } else if ( *no == SW_TOTAL ) {
  368.             tapeselecton() ;
  369.         } else {
  370.             if ( Flg.prgchk || Tcount2 >= PRG_WAIT || XORno != Dispno )
  371.                 dispselectmusicno( ZERO ) ;
  372.         }
  373.     } else {
  374.         if ( Flg.prgchk || Tcount2 >= PRG_WAIT || XORno != Dispno )
  375.             dispselectmusicno( ZERO ) ;
  376.     }
  377.  
  378.     if ( mbot == MOS_LEFT ) {
  379. /*-----------------------------------------------------------------------------
  380. **    曲番号 : 指定された曲番号が有効かどうかもチェックする.
  381. -----------------------------------------------------------------------------*/
  382.         if ( PSInf.x < mx && mx < (PSInf.x+604) &&
  383.                 (PSInf.y+YCDOT+1) < my && my < (PSInf.y+YCDOT+339) ) {
  384.             c = (mx+103) / 121 - 1 ;
  385.             *no = (my-PSInf.y) / 17 + 20*c ;
  386.             if ( ( CDDA_INFO_buf.start > *no || *no > CDDA_INFO_buf.end ) &&
  387.                 *no != SW_TOTAL ) return( FALSE ) ;
  388.             if ( *no == SW_TOTAL ) {            /*  ● TAPE選択 ●            */
  389.                 dispmouse( FALSE ) ;
  390.                 if ( tapeselecton() ) {                /*  有効    */
  391.                     mosloop( mbot,&mbot,&mx,&my ) ;    /*  マウスの開放を待つ        */
  392.                     TAPE_autoselect() ;
  393.                 }
  394.                 dispmouse( TRUE ) ;
  395.                 return( FALSE ) ;
  396.             } else {                            /*  ● 曲番号選択 ●        */
  397.                 if ( CDDA_data_check( *no ) )        /*  データ                */
  398.                     return( FALSE ) ;
  399.                 dispmouse( FALSE ) ;
  400.                 dispevent( *no,TRUE ) ;
  401.                 mosloop( mbot,&mbot,&mx,&my ) ;        /*  マウスの開放を待つ        */
  402.                 dispmouse( TRUE ) ;
  403.                 return( TRUE ) ;
  404.             }
  405.         }
  406. /*-----------------------------------------------------------------------------
  407. **    各種スイッチ : 選択された時点で、ON 表示して リターン する.
  408. **    呼び側で、OFF 表示等必要な処理をすること.
  409. -----------------------------------------------------------------------------*/
  410.         for ( c=0; c<SWPOINT; c++ ) {            /*  スイッチ                    */
  411.             if ( Position[c].s.x < mx && mx < Position[c].e.x &&
  412.                     Position[c].s.y < my && my < Position[c].e.y ) {
  413.                 *no = SWVAL + c ;
  414.                 dispmouse( FALSE ) ;
  415.                 dispevent( *no,TRUE ) ;
  416.                 dispmouse( TRUE ) ;
  417.                 return( TRUE ) ;
  418.             }
  419.         }
  420.     }
  421.     return( FALSE ) ;
  422. }
  423.  
  424. /****************************  演奏曲の表示チェック  *****************************/
  425. void checkmusic( int no )
  426. /*=============================================================================
  427. **    演奏曲が指定された時に表示のチェックを行う.
  428. **
  429. **    < INPUT  > : 演奏曲
  430. **    < OUTPUT > : なし
  431. **    < RETURN > : なし
  432. **
  433. **    マウスは呼び側でOFFにしておいて下さい.
  434. =============================================================================*/
  435. {
  436.     int        c ;
  437.  
  438.     if ( no < 1 || no > CDDA_MAX_TRACK ) return ;
  439.  
  440.     switch ( Playmode ) {
  441.     case SW_PROGRAM :
  442. /*-----------------------------------------------------------------------------
  443. **    プログラムモードで一曲も指定されていない時には、一旦全部の曲を消して(演奏終了
  444. **    状態)指定された曲を未演奏表示にする.
  445. -----------------------------------------------------------------------------*/
  446.         if ( !CDDA_TOTAL_program ) {
  447.             /*  プログラムモード時に一曲も指定されていない時    */
  448.             disptocmode( SW_PROGRAM,DUMMY ) ;
  449.         }
  450.         Prginf[no-1] ++ ;
  451.         Prgcnt[no-1] ++ ;
  452.         dispmusicno( no,TRUE ) ;
  453.         break ;
  454.     case SW_SINGLE :
  455. /*-----------------------------------------------------------------------------
  456. **    シングルモードでは、指定された曲番号以外は、OFF表示とする.
  457. -----------------------------------------------------------------------------*/
  458.         for ( c=1; c<no; c++ ) dispmusicno( c,FALSE ) ;
  459.         dispmusicno( no,TRUE ) ;
  460.         for ( c=no+1; c<=CDDA_INFO_buf.end; c++ ) dispmusicno( c,FALSE ) ;
  461.         break ;
  462.     case SW_CONTINUE :
  463. /*-----------------------------------------------------------------------------
  464. **    CONTINUEモードでは、シャッフル演奏ならば全て ON表示 とし、そうでなければ、
  465. **    指定された曲番号よりも前の曲を OFF表示, 以降を ON表示とする.
  466. -----------------------------------------------------------------------------*/
  467.         if ( Flg.shuffle ) {
  468.             disptoc( FALSE ) ;
  469.         } else {
  470.             for ( c=1; c<no; c++ ) dispmusicno( c,FALSE ) ;
  471.             for ( c=no; c<=CDDA_INFO_buf.end; c++ ) dispmusicno( c,TRUE ) ;
  472.         }
  473.     }
  474. }
  475.  
  476. /*******************************  スイッチ状態チェック  ******************************/
  477. void checkswitch( void )
  478. /*=============================================================================
  479. **    演奏状態に合わせた スイッチ の ON/OFF 表示を行う.
  480. **
  481. **    < INPUT  > : なし
  482. **    < OUTPUT > : なし
  483. **    < RETURN > : なし
  484. =============================================================================*/
  485. {
  486.     if ( Status == CDDA_NOW_status ) return ;
  487.  
  488.     dispmouse( FALSE ) ;
  489.     switch ( CDDA_NOW_status ) {
  490.     case CDDA_STAT_PLAY :
  491.         if ( Flg.shuffle ) dispshuffle( TRUE ) ;
  492.         else               dispshuffle( FALSE ) ;
  493.         dispplay( TRUE ) ;
  494.         disppause( FALSE ) ;
  495.         break ;
  496.     case CDDA_STAT_PAUSE :
  497.         if ( Flg.shuffle ) dispshuffle( TRUE ) ;
  498.         else               dispshuffle( FALSE ) ;
  499.         dispplay( TRUE ) ;
  500.         disppause( TRUE ) ;
  501.         break ;
  502.     case CDDA_STAT_STOP :
  503.         dispshuffle( FALSE ) ;
  504.         dispplay( FALSE ) ;
  505.         disppause( FALSE ) ;
  506.         break ;
  507.     case CDDA_STAT_NOTREADY :
  508.         dispswitch_check( SW_STOP ) ;
  509.         dispmsgclear() ;
  510.     }
  511.     dispmouse( TRUE ) ;
  512. }
  513.  
  514. /*****************************  PLAY/PAUSE状態チェック  **************************/
  515. void checkdisp_playmusic( void )
  516. /*=============================================================================
  517. **    演奏中の曲情報および時間表示を行う.
  518. **
  519. **    < INPUT  > : なし
  520. **    < OUTPUT > : なし
  521. **    < RETURN > : なし
  522. =============================================================================*/
  523. {
  524. /*-----------------------------------------------------------------------------
  525. **    演奏曲番号が変わっていなければ、時間表示だけを行う.
  526. -----------------------------------------------------------------------------*/
  527.     if ( Musicno == CDDA_NOW_musicno ) {
  528.         disptime( CDDA_NOW_musicno,Timemode ) ;
  529.         return ;
  530.     }
  531.  
  532. /*-----------------------------------------------------------------------------
  533. **    演奏曲番号が変わった時だけ、表示の チェック を行う.
  534. -----------------------------------------------------------------------------*/
  535. /*    ↓↓                        ★★ DEBUG ★★                        ↓↓    */
  536.     if ( CDDA_DEBUG ) {
  537.         printf( "<checkdisp_playmusic> " ) ;
  538.         printf( "musicno : %d -> %d",Musicno,CDDA_NOW_musicno ) ;
  539.         printf( " , mode : %xh , playon : %d\n",Playmode,Flg.playon ) ;
  540.     }
  541. /*    ↑↑                        ★★ DEBUG ★★                        ↑↑    */
  542.  
  543.     if ( Playmode == SW_PROGRAM ) {
  544. /*-----------------------------------------------------------------------------
  545. **    1曲演奏時に、演奏終了する前に次の曲の頭を少し演奏してしまうことがあるの
  546. **    で、表示する際には、チェックをする必要がある.
  547. -----------------------------------------------------------------------------*/
  548.         if ( CDDA_NOW_start == CDDA_NOW_end ) {    /*  一曲演奏時            */
  549.             if ( CDDA_NOW_start != CDDA_NOW_musicno ) return ;    
  550.         }
  551. /*-----------------------------------------------------------------------------
  552. **    演奏曲が変わったならば、演奏終了した曲のプログラム用演奏カウンタを デクリメント する.
  553. **    その結果、演奏カウンタが 0 になったならば、OFF表示する.
  554. **    演奏を開始した時には、Flg.playon が 真値である.
  555. -----------------------------------------------------------------------------*/
  556.         if ( Musicno > ZERO && !Flg.playon )
  557.             Prginf[Musicno-1] -- ;
  558.         if ( Prginf[Musicno-1] <= ZERO ) {
  559.             dispmouse( FALSE ) ;
  560.             dispmusicno( Musicno,FALSE ) ;
  561.             dispmouse( TRUE ) ;
  562.         }
  563.     } else {
  564.         switch ( Playmode ) {
  565.         case SW_SINGLE :
  566. /*-----------------------------------------------------------------------------
  567. **    1曲演奏時に、演奏終了する前に次の曲の頭を少し演奏してしまうことがあるの
  568. **    で、表示する際には、チェックをする必要がある.
  569. -----------------------------------------------------------------------------*/
  570.             if ( CDDA_NOW_start == CDDA_NOW_end ) {    /*  一曲演奏時        */
  571.                 if ( CDDA_NOW_start != CDDA_NOW_musicno ) return ;    
  572.             }
  573.         case SW_CONTINUE :
  574.             if ( Flg.shuffle ) break ;
  575.             if ( Flg.playon ) break ;
  576.             dispmouse( FALSE ) ;
  577.             dispmusicno( Musicno,FALSE ) ;
  578.             dispmusicno( CDDA_NOW_musicno,TRUE ) ;
  579.             dispmouse( TRUE ) ;
  580.             break ;
  581.         }
  582. /*-----------------------------------------------------------------------------
  583. **    演奏を開始した時には、Flg.playon が 真値である.
  584. -----------------------------------------------------------------------------*/
  585.         if ( !Flg.playon && Musicno > ZERO ) {
  586.             dispmouse( FALSE ) ;
  587.             dispmusicno( Musicno,FALSE ) ;
  588.             dispmusicno( CDDA_NOW_musicno,TRUE ) ;
  589.             dispmouse( TRUE ) ;
  590.         }
  591.     }
  592.     Flg.playon = FALSE ;
  593.  
  594. /*-----------------------------------------------------------------------------
  595. **    演奏中の曲番号を保持する.
  596. -----------------------------------------------------------------------------*/
  597.     Musicno = CDDA_NOW_musicno ;
  598.  
  599. /*-----------------------------------------------------------------------------
  600. **    演奏時間の表示を行う.
  601. -----------------------------------------------------------------------------*/
  602.     disptime( CDDA_NOW_musicno,Timemode ) ;
  603. }
  604.  
  605. /********************************  STOP状態チェック  *****************************/
  606. void checkdisp_stopmusic( void )
  607. /*=============================================================================
  608. **    停止中の曲情報および時間表示を行う.
  609. **
  610. **    < INPUT  > : なし
  611. **    < OUTPUT > : なし
  612. **    < RETURN > : なし
  613. =============================================================================*/
  614. {
  615.     int        c ;
  616.  
  617. /*-----------------------------------------------------------------------------
  618. **    演奏状態が変化した時だけ時間の表示の チェック を行う.
  619. -----------------------------------------------------------------------------*/
  620.     if ( Status == CDDA_NOW_status ) {
  621.         if ( !Noaflg && Tcount3 > NOA_WAIT ) {
  622.             SNDPLAY_stop( STOP_CH ) ;
  623.             SNDPLAY_play( STOP_CH,STOP_SND ) ;
  624.             Tcount3 = ZERO ;
  625.         }
  626.         return ;
  627.     }
  628.  
  629.     Noaflg  = FALSE ;
  630.     Tcount3 = ZERO ;
  631.  
  632. /*    ↓↓                        ★★ DEBUG ★★                        ↓↓    */
  633.     if ( CDDA_DEBUG ) {
  634.         printf( "<checkdisp_stopmusic> " ) ;
  635.         printf( "stop - status : %xh -> %xh\n",Status,CDDA_NOW_status ) ;
  636.     }
  637. /*    ↑↑                        ★★ DEBUG ★★                        ↑↑    */
  638.  
  639. /*-----------------------------------------------------------------------------
  640. **    時間表示を消す.
  641. -----------------------------------------------------------------------------*/
  642.     disptime( ZERO,TM_NODISP ) ;
  643.  
  644. /*-----------------------------------------------------------------------------
  645. **    プログラムモードの時は、プログラム曲が表示されている間に演奏したり停止したりと
  646. **    いうことがありえる. そのため停止状態になったからといって無条件に表示状態
  647. **    を変更できない.
  648. -----------------------------------------------------------------------------*/
  649.     if ( Playmode != SW_PROGRAM || Flg.program ) {
  650. /*-----------------------------------------------------------------------------
  651. **    プログラムモード以外かプログラム演奏が終了した時には、表示をクリアする.
  652. -----------------------------------------------------------------------------*/
  653.         for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
  654.             Prginf[c] = ZERO ;
  655.             if ( !Flg.repeat ) Prgcnt[c] = ZERO ;
  656.         }
  657.         if ( !Flg.repeat ) {
  658.             if ( Flg.tape ) {                    /*  テープ選択処理時            */
  659.                 dispmsgclear() ;
  660.             }
  661.             Flg.tape = FALSE ;
  662.         }
  663.         dispmouse( FALSE ) ;
  664.         if ( Playmode == SW_PROGRAM ) {
  665.             disptocmode( SW_PROGRAM,DUMMY ) ;
  666.         } else {
  667.             disptoc( FALSE ) ;
  668.         }
  669.         if ( Playmode == SW_PROGRAM ) dispprogramtime() ;
  670.         dispmouse( TRUE ) ;
  671.     }
  672.     Flg.program = FALSE ;
  673.     Musicno = ZERO ;
  674. }
  675.  
  676. /********************************  eject状態チェック  ****************************/
  677. void checkdisp_eject( void )
  678. /*=============================================================================
  679. **    CD が 抜かれた状態の表示を行う.
  680. **
  681. **    < INPUT  > : なし
  682. **    < OUTPUT > : なし
  683. **    < RETURN > : なし
  684. =============================================================================*/
  685. {
  686.     valinit() ;
  687.     dispmouse( FALSE ) ;
  688.     dispswitch_check( SW_STOP ) ;
  689.     disptocclear() ;
  690.     disptime( ZERO,TM_NODISP ) ;
  691.     dispmsgclear() ;
  692.     MOS_horizon( Position[SW_EXIT].s.x,Position[SW_EXIT].e.x ) ;
  693.     MOS_vertical( Position[SW_EXIT].s.y,Position[SW_EXIT].e.y ) ;
  694.     mossetpos( SW_EXIT+SWVAL ) ;
  695.     dispmouse( TRUE ) ;
  696.     Noaflg  = FALSE ;
  697.     Tcount3 = ZERO ;
  698. }
  699.  
  700. /********************************  reset状態チェック  ****************************/
  701. void checkdisp_reset( void )
  702. /*=============================================================================
  703. **    CD が セット された状態の表示を行う.
  704. **
  705. **    < INPUT  > : なし
  706. **    < OUTPUT > : なし
  707. **    < RETURN > : なし
  708. =============================================================================*/
  709. {
  710.     Noaflg  = FALSE ;
  711.     Tcount3 = ZERO ;
  712.     dispmouse( FALSE ) ;
  713.     /*    ●● PLAY SWITCH ON ●●    */
  714.     if ( Startplay ) {
  715.         disperrormsg( CDDA_switch( CDDA_SW_PLAY ) ) ;
  716.         if ( CDDA_NOW_status == CDDA_STAT_PLAY ) dispplay( TRUE ) ;
  717.     } else {
  718.         disperrormsg( CDDA_switch( CDDA_SW_TOCREAD ) ) ;
  719.     }
  720.     disptocmode( Playmode,CDDA_NOW_musicno ) ;
  721.     if ( Playmode == SW_PROGRAM ) dispprogramtime() ;
  722.     MOS_horizon( 0,639 ) ;
  723.     MOS_vertical( 0,479 ) ;
  724.     mossetpos( SW_PLAY+SWVAL ) ;
  725.     dispmouse( TRUE ) ;
  726. }
  727.  
  728. /*******************************  CD演奏状態チェック  ****************************/
  729. void checkstatus( void )
  730. /*=============================================================================
  731. **    演奏状態に応じた画面表示を行う.
  732. **
  733. **    < INPUT  > : なし
  734. **    < OUTPUT > : なし
  735. **    < RETURN > : なし
  736. =============================================================================*/
  737. {
  738.     static char    ready = FALSE ;
  739.     int        ret ;
  740.     int        c ;
  741.  
  742.     /*    ●● ステータス取得 ●●    */
  743.     ret = CDDA_switch( CDDA_SW_STATUS ) ;
  744.     checkswitch() ;
  745.  
  746.     if ( ret == CDDA_ERR_REPEAT ) {
  747. /*-----------------------------------------------------------------------------
  748. **    リピート演奏に入った時の処理
  749. -----------------------------------------------------------------------------*/
  750.         dispmouse( FALSE ) ;
  751. /*-----------------------------------------------------------------------------
  752. **    演奏を開始した時と同じであるので、フラグ を セット する.
  753. -----------------------------------------------------------------------------*/
  754.         Flg.playon  = TRUE ;
  755.         Flg.program = TRUE ;
  756.         switch ( Playmode ) {
  757.         case SW_SINGLE :
  758.             disptocmode( Playmode,CDDA_NOW_musicno ) ;
  759.             break ;
  760.         case SW_CONTINUE :
  761.             disptocmode( Playmode,DUMMY ) ;
  762.             break ;
  763.         case SW_PROGRAM :
  764.             for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
  765.                 Prginf[c] = Prgcnt[c] ;
  766.             }
  767.             disptocmode( SW_PROGRAM,DUMMY ) ;
  768.         }
  769.         dispmouse( TRUE ) ;
  770.  
  771.     } else if ( ret ) {
  772.  
  773. /*    ↓↓                        ★★ DEBUG ★★                        ↓↓    */
  774.         if ( CDDA_DEBUG ) {
  775.             if ( ret == CDDA_ERR_NOTREADY ) {
  776.                 printf("*") ;
  777.             } else {
  778.                 printf( "<checkstatus> " ) ;
  779.                 printf( "SW_STATUS error return : %xh",ret ) ;
  780.                 printf( " , status : %xh -> %xh\n",Status,CDDA_NOW_status ) ;
  781.             }
  782.         }
  783. /*    ↑↑                        ★★ DEBUG ★★                        ↑↑    */
  784.  
  785. /*-----------------------------------------------------------------------------
  786. **    NOT READY 状態になった場合の処理
  787. -----------------------------------------------------------------------------*/
  788.         if ( ready ) {
  789.             ready  = FALSE ;
  790. /*    ↓↓                        ★★ DEBUG ★★                        ↓↓    */
  791.             if ( CDDA_DEBUG ) {
  792.                 printf( "<checkstatus> " ) ;
  793.                 printf( "now CD eject - return : %xh",ret ) ;
  794.                 printf( " , status : %xh -> %xh\n",Status,CDDA_NOW_status ) ;
  795.             }
  796. /*    ↑↑                        ★★ DEBUG ★★                        ↑↑    */
  797.             SNDPLAY_stop( STOP_CH ) ;
  798.             SNDPLAY_stop( RESET_CH ) ;
  799.             SNDPLAY_play( EJECT_CH,EJECT_SND ) ;
  800.             checkdisp_eject() ;
  801.         } else {
  802.             if ( !Noaflg && Tcount3 > NOA_WAIT ) {
  803.                 SNDPLAY_stop( STOP_CH ) ;
  804.                 SNDPLAY_play( STOP_CH,STOP_SND ) ;
  805.                 Tcount3 = ZERO ;
  806.             }
  807.         }
  808.         Musicno = ZERO ;
  809.  
  810.     } else {
  811.         ready = TRUE ;
  812.         if ( CDDA_NOW_status != CDDA_STAT_NOTREADY ) {
  813.             if ( Status == CDDA_STAT_NOTREADY ) {
  814. /*-----------------------------------------------------------------------------
  815. **    NOT READY 状態から、CD が セット された時の処理
  816. -----------------------------------------------------------------------------*/
  817. /*    ↓↓                        ★★ DEBUG ★★                        ↓↓    */
  818.                 if ( CDDA_DEBUG ) {
  819.                     printf( "<checkdisp_reset> " ) ;
  820.                     printf( "now CD set - return : %xh",ret ) ;
  821.                     printf( " , status : %xh -> %xh\n",
  822.                             Status,CDDA_NOW_status ) ;
  823.                 }
  824. /*    ↑↑                        ★★ DEBUG ★★                        ↑↑    */
  825.                 SNDPLAY_stop( STOP_CH ) ;
  826.                 SNDPLAY_stop( EJECT_CH ) ;
  827.                 SNDPLAY_play( RESET_CH,RESET_SND ) ;
  828.                 checkdisp_reset() ;
  829.             } else {
  830. /*-----------------------------------------------------------------------------
  831. **    通常状態の処理
  832. -----------------------------------------------------------------------------*/
  833.                 if ( Status != CDDA_NOW_status ) {
  834.  
  835. /*    ↓↓                        ★★ DEBUG ★★                        ↓↓    */
  836.                     if ( CDDA_DEBUG ) {
  837.                         printf( "<checkstatus> " ) ;
  838.                         printf( "status : %xh -> %xh\n",
  839.                                 Status,CDDA_NOW_status ) ;
  840.                     }
  841. /*    ↑↑                        ★★ DEBUG ★★                        ↑↑    */
  842.  
  843.                     checkswitch() ;
  844.                 }
  845.  
  846.                 switch ( CDDA_NOW_status ) {
  847.                 case CDDA_STAT_PLAY :
  848.                     Flg.pause = FALSE ;
  849.                 case CDDA_STAT_PAUSE :
  850.                     SNDPLAY_stop( STOP_CH ) ;
  851.                     SNDPLAY_stop( EJECT_CH ) ;
  852.                     SNDPLAY_stop( RESET_CH ) ;
  853.                     checkdisp_playmusic() ;
  854.                     break ;
  855.                 case CDDA_STAT_STOP :
  856.                     Flg.pause = FALSE ;
  857.                     checkdisp_stopmusic() ;
  858.                 }
  859.             }    /*  ステータス取得 CD READY    */
  860.  
  861. /*    ↓↓                        ★★ DEBUG ★★                        ↓↓    */
  862.             if ( CDDA_DEBUG ) {
  863.                 if ( Status != CDDA_NOW_status ) {
  864.                     printf( "<checkstatus> " ) ;
  865.                     printf( "normal - status : %xh -> %xh\n",
  866.                             Status,CDDA_NOW_status ) ;
  867.                 }
  868.             }
  869. /*    ↑↑                        ★★ DEBUG ★★                        ↑↑    */
  870.  
  871.         }    /*  現在 READY 状態    */
  872.     }    /*  ステータス取得 ERROR or NOERROR    */
  873.  
  874.     Status = CDDA_NOW_status ;
  875. }
  876.  
  877. /*******************************  曲選択処理  ********************************/
  878. void selectmusic( int no )
  879. /*=============================================================================
  880. **    曲が選択された時の処理を行う.
  881. **
  882. **    < INPUT  > : 曲番号
  883. **    < OUTPUT > : なし
  884. **    < RETURN > : なし
  885. **
  886. **    マウスは呼び側でOFFにしておいて下さい.
  887. =============================================================================*/
  888. {
  889.     int        ret ;
  890.  
  891.     if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
  892.         return ;
  893.     } else {
  894.         if ( Playmode == SW_PROGRAM ) {
  895.             /*    ●● 曲番号 ON ●●    */
  896.             ret = CDDA_switch( no ) ;
  897.             if ( !ret ) {
  898. /*-----------------------------------------------------------------------------
  899. **    プログラム曲の登録時には、時間表示は、TM_TR_CLOCK とする.
  900. **    また、CHECK時同様プログラム曲確認中表示である旨を フラグセット する.
  901. **    曲の登録作業は、checkmusic() で行う.
  902. -----------------------------------------------------------------------------*/
  903.                 Timemode   = TM_TR_CLOCK ;
  904.                 Flg.prgchk = TRUE ;
  905.                 checkmusic( no ) ;
  906.                 disptime( no,Timemode ) ;
  907.                 TAPE_check() ;
  908.                 dispprogramtime() ;
  909.             }
  910.         } else {
  911.             disptime( ZERO,TM_NODISP ) ;
  912.             checkmusic( no ) ;
  913.             /*    ●● 曲番号 ON ●●    */
  914.             if ( !CDDA_switch( no ) ) {
  915.                 dispplay( TRUE ) ;
  916.                 Flg.playon = TRUE ;
  917.                 if ( Flg.shuffle ) {
  918.                     Flg.shuffle = FALSE ;
  919.                     dispshuffle( FALSE ) ;
  920.                     disptocmode( SW_CONTINUE,no ) ;
  921.                 }
  922.             } else {
  923. /*-----------------------------------------------------------------------------
  924. **    指定された曲が演奏できなかった時には、PLAYボタンを OFF表示する.
  925. -----------------------------------------------------------------------------*/
  926.                 switch ( CDDA_NOW_status ) {
  927.                 case CDDA_STAT_PLAY :
  928.                 case CDDA_STAT_PAUSE :
  929.                     break ;
  930.                 default :
  931.                     dispplay( FALSE ) ;
  932.                     dispmusicno( no,FALSE ) ;
  933.                 }
  934.             }
  935.             disptime( no,Timemode ) ;
  936. /*-----------------------------------------------------------------------------
  937. **    PAUSE中に曲番号が指定された時には、マウス を PLAYボタンに移動しておく.
  938. -----------------------------------------------------------------------------*/
  939.             if ( CDDA_NOW_status == CDDA_STAT_PAUSE ) {
  940.                 mossetpos( SW_PLAY+SWVAL ) ;
  941.             }
  942.         }
  943.     }
  944. }
  945.  
  946. /******************************  モード選択処理  *******************************/
  947. void selectmode( int mode )
  948. /*=============================================================================
  949. **    演奏モードが選択された時の処理を行う.
  950. **
  951. **    < INPUT  > : 演奏モード
  952. **    < OUTPUT > : なし
  953. **    < RETURN > : なし
  954. **
  955. **    マウスは呼び側でOFFにしておいて下さい.
  956. =============================================================================*/
  957. {
  958.     int        c ;
  959.  
  960. /*-----------------------------------------------------------------------------
  961. **    各演奏モードは、演奏モードが変わった時だけ処理を行う.
  962. -----------------------------------------------------------------------------*/
  963.     switch ( mode ) {
  964.     case SW_PROGRAM :
  965.         Timemode = TM_TR_CLOCK ;
  966.         if ( Playmode != SW_PROGRAM &&
  967.                 CDDA_NOW_status != CDDA_STAT_NOTREADY ) {
  968.             MOS_color( 0,C_REDON ) ;
  969.             dispmsgclear() ;
  970.             /*  ● シャッフル演奏中にプログラムモードに移行した時 ●    */
  971.             Flg.shuffle = FALSE ;
  972.             dispshuffle( FALSE ) ;
  973.             dispevent( mode+SWVAL,TRUE ) ;
  974. /*-----------------------------------------------------------------------------
  975. **    プログラム登録状況をクリアする.
  976. -----------------------------------------------------------------------------*/
  977.             for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
  978.                 Prginf[c] = ZERO ;
  979.                 Prgcnt[c] = ZERO ;
  980.             }
  981.             Flg.tape = FALSE ;
  982.             if ( ( CDDA_NOW_status == CDDA_STAT_PLAY ||
  983.                     CDDA_NOW_status == CDDA_STAT_PAUSE ) &&
  984.                     CDDA_NOW_musicno > ZERO ) {
  985. /*-----------------------------------------------------------------------------
  986. **    演奏中(PAUSE含)ならば、その曲はプログラム登録される.
  987. -----------------------------------------------------------------------------*/
  988.                 Flg.program = TRUE ;
  989.                 Flg.prgchk  = TRUE ;
  990.                 Prginf[CDDA_NOW_musicno-1] ++ ;
  991.                 Prgcnt[CDDA_NOW_musicno-1] ++ ;
  992.             }
  993.             disptocmode( SW_PROGRAM,DUMMY ) ;
  994.             Playmode = SW_PROGRAM ;
  995.             disptimeprgsw() ;
  996.         }
  997.         Playmode = SW_PROGRAM ;
  998.         /*    ●● PROGRAM MODE SWITCH ON ●●    */
  999.         CDDA_switch( CDDA_SW_PROGRAM ) ;
  1000. /*-----------------------------------------------------------------------------
  1001. **    ライブラリ CALL 後に、プログラム登録時間が設定される.
  1002. -----------------------------------------------------------------------------*/
  1003.         dispprogramtime() ;
  1004.         break ;
  1005.     case SW_SINGLE :
  1006.         if ( Playmode != SW_SINGLE &&
  1007.                 CDDA_NOW_status != CDDA_STAT_NOTREADY ) {
  1008.             MOS_color( 0,C_YELLOW ) ;
  1009.             dispmsgclear() ;
  1010.             /*  ● シャッフル演奏中にプログラムモードに移行した時 ●    */
  1011.             Flg.shuffle = FALSE ;
  1012.             dispshuffle( FALSE ) ;
  1013.             dispevent( mode+SWVAL,TRUE ) ;
  1014. /*-----------------------------------------------------------------------------
  1015. **    演奏中ならば、演奏曲だけがON表示.
  1016. **    停止中ならば、すべてON表示.
  1017. -----------------------------------------------------------------------------*/
  1018.             if ( CDDA_NOW_status == CDDA_STAT_STOP ) {
  1019.                 disptoc( FALSE ) ;
  1020.             } else {
  1021.                 disptocmode( SW_SINGLE,CDDA_NOW_musicno ) ;
  1022.             }
  1023.             if ( Playmode == SW_PROGRAM ) {
  1024.                 Playmode = SW_SINGLE ;
  1025.                 disptimeprgsw() ;
  1026.             }
  1027.         }
  1028.         Playmode = SW_SINGLE ;
  1029.         /*    ●● SINGLE MODE SWITCH ON ●●    */
  1030.         CDDA_switch( CDDA_SW_SINGLE ) ;
  1031.         break ;
  1032.     case SW_CONTINUE :
  1033.         if ( Playmode != SW_CONTINUE &&
  1034.                 CDDA_NOW_status != CDDA_STAT_NOTREADY ) {
  1035.             MOS_color( 0,C_GREENON ) ;
  1036.             dispmsgclear() ;
  1037.             /*  ● シャッフル演奏中にプログラムモードに移行した時 ●    */
  1038.             Flg.shuffle = FALSE ;
  1039.             dispshuffle( FALSE ) ;
  1040.             dispevent( mode+SWVAL,TRUE ) ;
  1041.             if ( CDDA_NOW_status == CDDA_STAT_PLAY ||
  1042.                     CDDA_NOW_status == CDDA_STAT_PAUSE ) {
  1043.                 disptocmode( SW_CONTINUE,CDDA_NOW_musicno ) ;
  1044.             } else {
  1045.                 disptoc( FALSE ) ;
  1046.             }
  1047.             if ( Playmode == SW_PROGRAM ) {
  1048.                 Playmode = SW_CONTINUE ;
  1049.                 disptimeprgsw() ;
  1050.             }
  1051.             Flg.playon  = FALSE ;
  1052.         }
  1053.         Playmode = SW_CONTINUE ;
  1054.         /*    ●● CONTINUE MODE SWITCH ON ●●    */
  1055.         CDDA_switch( CDDA_SW_CONTINUE ) ;
  1056.     }
  1057. }
  1058.  
  1059. /*****************************  FF/REW 選択処理  *****************************/
  1060. void selectffrew( int mode )
  1061. /*=============================================================================
  1062. **    先送り/後戻りが選択された時の処理を行う.
  1063. **
  1064. **    < INPUT  > : 先送り/後戻りスイッチ
  1065. **    < OUTPUT > : なし
  1066. **    < RETURN > : なし
  1067. **
  1068. **    マウスは呼び側でOFFにしておいて下さい.
  1069. =============================================================================*/
  1070. {
  1071.     int        mbot, mx, my ;
  1072.     int        no, evno ;
  1073.  
  1074. /*-----------------------------------------------------------------------------
  1075. **    Flg.prgchk が真値だと、時間表示されないので、FALSEにし待ち時間をクリアする.
  1076. -----------------------------------------------------------------------------*/
  1077.     Flg.prgchk = FALSE ;
  1078.     Tcount2 = PRG_WAIT + 1 ;
  1079.  
  1080.     evno = mode + SWVAL ;
  1081.  
  1082. /*-----------------------------------------------------------------------------
  1083. **    演奏中かPAUSE中でなければ、スイッチをOFFにして リターン する.
  1084. -----------------------------------------------------------------------------*/
  1085.     if ( CDDA_NOW_status != CDDA_STAT_PLAY &&
  1086.             CDDA_NOW_status != CDDA_STAT_PAUSE ) {
  1087.         dispevent( evno,FALSE ) ;
  1088.         return ;
  1089.     }
  1090.  
  1091. /*-----------------------------------------------------------------------------
  1092. **    曲番号が変わった時には、ここで曲表示のON/OFFを行うので、演奏開始した時と
  1093. **    同様に、Flg.playon を TRUE にしておく.
  1094. **
  1095. **    スイッチ が押されている間は、ここで繰り返し処理を行う.
  1096. **    スイッチ が放された時に、リターンする.
  1097. **
  1098. **    先送り/後戻りのスイッチをONとして、ライブラリ を CALL した後には、スイッチ が放された
  1099. **    時点で、そのことを ライブラリ に通知する. (CDDA_SW_BREAKスイッチでCALL)
  1100. -----------------------------------------------------------------------------*/
  1101.     switch ( mode ) {
  1102.     case SW_REWMUSIC :
  1103.         no = CDDA_NOW_musicno ;
  1104.         /*    ●● 曲戻し SWITCH ON ●●    */
  1105.         CDDA_switch( CDDA_SW_REWMUSIC ) ;
  1106.         if ( no != CDDA_NOW_musicno ) {
  1107.             Flg.playon = TRUE ;
  1108.             dispmusicno( CDDA_NOW_musicno,TRUE ) ;
  1109.             if ( Playmode == SW_SINGLE ) {
  1110.                 dispmusicno( no,FALSE ) ;
  1111.             }
  1112.         }
  1113.         disptime( CDDA_NOW_musicno,Timemode ) ;
  1114.         mosloop( MOS_LEFT,&mbot,&mx,&my ) ;
  1115.         /*    ●● SWITCH 開放 ●●    */
  1116.         CDDA_switch( CDDA_SW_BREAK ) ;
  1117.         dispevent( evno,FALSE ) ;
  1118.         break ;
  1119.     case SW_REWTIME :
  1120.         no = CDDA_NOW_musicno ;
  1121.         /*    ●● 時間戻し SWITCH ON ●●    */
  1122.         CDDA_switch( CDDA_SW_REWTIME ) ;
  1123.         if ( no != CDDA_NOW_musicno ) {
  1124.             Flg.playon = TRUE ;
  1125.             dispmusicno( CDDA_NOW_musicno,TRUE ) ;
  1126.             if ( Playmode == SW_SINGLE ) {
  1127.                 dispmusicno( no,FALSE ) ;
  1128.             }
  1129.         }
  1130.         disptime( CDDA_NOW_musicno,Timemode ) ;
  1131.         while ( TRUE ) {
  1132.             MOS_rdpos( &mbot,&mx,&my ) ;
  1133.             if ( mbot != MOS_LEFT ) break ;
  1134.             no = CDDA_NOW_musicno ;
  1135.             /*    ●● 時間戻し SWITCH ON ●●    */
  1136.             if ( CDDA_switch( CDDA_SW_REWTIME ) ) break ;
  1137.             if ( no != CDDA_NOW_musicno ) {
  1138.                 Flg.playon = TRUE ;
  1139.                 dispmusicno( CDDA_NOW_musicno,TRUE ) ;
  1140.                 if ( Playmode == SW_SINGLE ) {
  1141.                     dispmusicno( no,FALSE ) ;
  1142.                 }
  1143.             }
  1144.             disptime( CDDA_NOW_musicno,Timemode ) ;
  1145.         } ;
  1146.         mosloop( MOS_LEFT,&mbot,&mx,&my ) ;
  1147.         /*    ●● SWITCH 開放 ●●    */
  1148.         CDDA_switch( CDDA_SW_BREAK ) ;
  1149.         dispevent( evno,FALSE ) ;
  1150.         break ;
  1151.     case SW_FFTIME :
  1152.         no = CDDA_NOW_musicno ;
  1153.         /*    ●● 時間送り SWITCH ON ●●    */
  1154.         CDDA_switch( CDDA_SW_FFTIME ) ;
  1155.         if ( no != CDDA_NOW_musicno ) {
  1156.             if ( Playmode == SW_PROGRAM ) {
  1157.                 Flg.playon = TRUE ;
  1158.                 if ( no > ZERO ) Prginf[no-1] -- ;
  1159.                 if ( Prginf[no-1] <= ZERO ) dispmusicno( no,FALSE ) ;
  1160.             } else {
  1161.                 dispmusicno( no,FALSE ) ;
  1162.             }
  1163.             dispmusicno( CDDA_NOW_musicno,TRUE ) ;
  1164.         }
  1165.         disptime( CDDA_NOW_musicno,Timemode ) ;
  1166.         while ( TRUE ) {
  1167.             MOS_rdpos( &mbot,&mx,&my ) ;
  1168.             if ( mbot != MOS_LEFT ) break ;
  1169.             no = CDDA_NOW_musicno ;
  1170.             /*    ●● 時間送り SWITCH ON ●●    */
  1171.             if ( CDDA_switch( CDDA_SW_FFTIME ) ) break ;
  1172.             if ( no != CDDA_NOW_musicno ) {
  1173.                 if ( Playmode == SW_PROGRAM ) {
  1174.                     Flg.playon = TRUE ;
  1175.                     if ( no > ZERO ) Prginf[no-1] -- ;
  1176.                     if ( Prginf[no-1] <= ZERO ) dispmusicno( no,FALSE ) ;
  1177.                 } else {
  1178.                     dispmusicno( no,FALSE ) ;
  1179.                 }
  1180.                 dispmusicno( CDDA_NOW_musicno,TRUE ) ;
  1181.             }
  1182.             disptime( CDDA_NOW_musicno,Timemode ) ;
  1183.         } ;
  1184.         mosloop( MOS_LEFT,&mbot,&mx,&my ) ;
  1185.         /*    ●● SWITCH 開放 ●●    */
  1186.         CDDA_switch( CDDA_SW_BREAK ) ;
  1187.         dispevent( evno,FALSE ) ;
  1188.         break ;
  1189.     case SW_FFMUSIC :
  1190.         no = CDDA_NOW_musicno ;
  1191.         /*    ●● 曲送り SWITCH ON ●●    */
  1192.         CDDA_switch( CDDA_SW_FFMUSIC ) ;
  1193.         if ( no != CDDA_NOW_musicno ) {
  1194.             if ( Playmode == SW_PROGRAM ) {
  1195.                 Flg.playon = TRUE ;
  1196.                 if ( no > ZERO ) Prginf[no-1] -- ;
  1197.                 if ( Prginf[no-1] <= ZERO ) dispmusicno( no,FALSE ) ;
  1198.             } else {
  1199.                 dispmusicno( no,FALSE ) ;
  1200.             }
  1201.             dispmusicno( CDDA_NOW_musicno,TRUE ) ;
  1202.         }
  1203.         disptime( CDDA_NOW_musicno,Timemode ) ;
  1204.         mosloop( MOS_LEFT,&mbot,&mx,&my ) ;
  1205.         /*    ●● SWITCH 開放 ●●    */
  1206.         CDDA_switch( CDDA_SW_BREAK ) ;
  1207.         dispevent( evno,FALSE ) ;
  1208.     }
  1209. }
  1210.  
  1211. /*******************************  演奏選択処理  ******************************/
  1212. void selectplay( int mode )
  1213. /*=============================================================================
  1214. **    演奏が選択された時の処理を行う.
  1215. **
  1216. **    < INPUT  > : 演奏スイッチ
  1217. **    < OUTPUT > : なし
  1218. **    < RETURN > : なし
  1219. **
  1220. **    マウスは呼び側でOFFにしておいて下さい.
  1221. =============================================================================*/
  1222. {
  1223.     int        no, evno ;
  1224.  
  1225.     evno = mode + SWVAL ;
  1226.     switch ( mode ) {
  1227.     case SW_SHUFFLE :
  1228.         Flg.shuffle = FALSE ;
  1229. /*-----------------------------------------------------------------------------
  1230. **    シャッフル指定時は、CONTINUEモードと同じ表示とする。
  1231. -----------------------------------------------------------------------------*/
  1232.         disptoc( FALSE ) ;
  1233.         selectmode( SW_CONTINUE ) ;
  1234.         if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
  1235.             dispevent( evno,FALSE ) ;
  1236.             break ;
  1237.         }
  1238.         /*    ●● SHUFFLE SWITCH ON ●●    */
  1239.         no = CDDA_switch( CDDA_SW_SHUFFLE ) ;
  1240.         if ( !no ) {
  1241.             /*  演奏 OK!    */
  1242.             Flg.playon  = TRUE ;
  1243.             Flg.shuffle = TRUE ;
  1244.             dispshuffle( TRUE ) ;
  1245.             dispplay( TRUE ) ;
  1246.             checkmusic( CDDA_NOW_start ) ;
  1247.             disptime( CDDA_NOW_start,Timemode ) ;
  1248.         } else {
  1249.             /*  演奏 NG!    */
  1250.             dispshuffle( FALSE ) ;
  1251.             dispplay( FALSE ) ;
  1252.             disptoc( FALSE ) ;
  1253.             disptime( ZERO,TM_NODISP ) ;
  1254.         }
  1255.         break ;
  1256.     case SW_PLAY :
  1257.         if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
  1258.             dispevent( evno,FALSE ) ;
  1259.             break ;
  1260.         }
  1261.         if ( Playmode == SW_PROGRAM && !CDDA_TOTAL_program ) {
  1262. /*-----------------------------------------------------------------------------
  1263. **    プログラムモードなのに一曲も指定されていない時には、CONTINUEモードに移行して演奏
  1264. **    する.
  1265. -----------------------------------------------------------------------------*/
  1266.             selectmode( SW_CONTINUE ) ;
  1267.             /*    ●● PLAY SWITCH ON ●●    */
  1268.             no = CDDA_switch( CDDA_SW_PLAY ) ;
  1269.             if ( no ) dispplay( FALSE ) ;
  1270.         } else {
  1271.             /*    ●● PLAY SWITCH ON ●●    */
  1272.             no = CDDA_switch( CDDA_SW_PLAY ) ;
  1273.             disperrormsg( no ) ;
  1274.             if ( !no ) {
  1275.                 /*  演奏 OK!    */
  1276.                 if ( !Flg.pause ) Flg.playon  = TRUE ;
  1277.                 switch ( Playmode ) {
  1278.                 case SW_PROGRAM :
  1279.                     Flg.program = TRUE ;
  1280.                     disptocmode( SW_PROGRAM,DUMMY ) ;
  1281.                     break ;
  1282.                 case SW_CONTINUE :
  1283.                     if ( Flg.shuffle && !Flg.pause ) {
  1284.                         Flg.shuffle = FALSE ;
  1285.                         dispshuffle( FALSE ) ;
  1286.                         disptocmode( SW_CONTINUE,CDDA_NOW_musicno ) ;
  1287.                     }
  1288.                     break ;
  1289.                 case SW_SINGLE :
  1290.                     checkmusic( CDDA_NOW_start ) ;
  1291.                 }
  1292.             } else {
  1293.                 /*  演奏 NG!    */
  1294.                 if ( CDDA_NOW_status != CDDA_STAT_PLAY ) {
  1295.                     dispplay( FALSE ) ;
  1296.                 }
  1297.             }
  1298.         }
  1299.         disptime( CDDA_NOW_start,Timemode ) ;
  1300.         Flg.pause = FALSE ;
  1301.     }
  1302. }
  1303.  
  1304. /*******************************  停止選択処理  ******************************/
  1305. void selectstop( int mode )
  1306. /*=============================================================================
  1307. **    停止が選択された時の処理を行う.
  1308. **
  1309. **    < INPUT  > : 停止スイッチ
  1310. **    < OUTPUT > : なし
  1311. **    < RETURN > : なし
  1312. **
  1313. **    マウスは呼び側でOFFにしておいて下さい.
  1314. =============================================================================*/
  1315. {
  1316.     int        evno ;
  1317.     int        c ;
  1318.  
  1319.     evno = mode + SWVAL ;
  1320.     switch ( mode ) {
  1321.     case SW_STOP :
  1322.         Flg.pause   = FALSE ;
  1323.         Flg.shuffle = FALSE ;
  1324.         Flg.program = FALSE ;
  1325. /*-----------------------------------------------------------------------------
  1326. **    プログラムモード時に停止中ならばプログラム設定曲をクリアする。
  1327. -----------------------------------------------------------------------------*/
  1328.         if ( Playmode == SW_PROGRAM && CDDA_NOW_status == CDDA_STAT_STOP ) {
  1329.             for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
  1330.                 Prginf[c] = ZERO ;
  1331.                 Prgcnt[c] = ZERO ;
  1332.             }
  1333.             Flg.tape = FALSE ;
  1334.             disptocmode( SW_PROGRAM,DUMMY ) ;
  1335.             disptime( ZERO,TM_NODISP ) ;
  1336.             /*    ●● STOP SWITCH ON ●●    */
  1337.             CDDA_switch( CDDA_SW_STOP ) ;
  1338.             dispmsgclear() ;
  1339.             dispprogramtime() ;
  1340.         }
  1341.         if ( CDDA_NOW_status == CDDA_STAT_PLAY ||
  1342.                 CDDA_NOW_status == CDDA_STAT_PAUSE ) {
  1343.             /*    ●● STOP SWITCH ON ●●    */
  1344.             CDDA_switch( CDDA_SW_STOP ) ;
  1345.         }
  1346.         dispshuffle( FALSE ) ;
  1347.         disppause( FALSE ) ;
  1348.         dispplay( FALSE ) ;
  1349.         dispevent( evno,FALSE ) ;
  1350.         break ;
  1351.     case SW_PAUSE :
  1352.         if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
  1353.             dispevent( evno,FALSE ) ;
  1354.             break ;
  1355.         }
  1356.         if ( Playmode == SW_PROGRAM && CDDA_TOTAL_program == ZERO ) {
  1357.             dispevent( evno,FALSE ) ;
  1358.             break ;
  1359.         }
  1360.         if ( Flg.pause ) {
  1361.             Flg.pause = FALSE ;
  1362.         } else {
  1363.             Flg.pause = TRUE ;
  1364.             dispplay( TRUE ) ;
  1365.         }
  1366.         disppause( Flg.pause ) ;
  1367.         /*    ●● PAUSE SWITCH ON/OFF ●●    */
  1368.         CDDA_switch( CDDA_SW_PAUSE ) ;
  1369.         break ;
  1370.     }
  1371. }
  1372.  
  1373. /******************************  プログラム操作処理  ****************************/
  1374. void selectprogramsw( int sw )
  1375. /*=============================================================================
  1376. **    プログラムの確認/クリアが選択された時の処理を行う.
  1377. **
  1378. **    < INPUT  > : プログラム確認/クリアスイッチ
  1379. **    < OUTPUT > : なし
  1380. **    < RETURN > : なし
  1381. **
  1382. **    マウスは呼び側でOFFにしておいて下さい.
  1383. =============================================================================*/
  1384. {
  1385.     int        no, evno ;
  1386.     int        nowmusic ;
  1387.  
  1388.     evno = sw + SWVAL ;
  1389.     dispevent( evno,FALSE ) ;
  1390.  
  1391.     if ( Playmode != SW_PROGRAM || CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
  1392.         return ;
  1393.     }
  1394.  
  1395.     switch ( sw ) {
  1396.     case SW_CHECK :
  1397.         Timemode = TM_TR_CLOCK ;
  1398.         /*    ●● SCHECK SWITCH ON ●●    */
  1399.         no = CDDA_switch( CDDA_SW_PRG_CHECK ) ;
  1400.         if ( no ) dispmusicno( CDDA_NOW_musicno,TRUE ) ;
  1401.         Flg.prgchk = TRUE ;
  1402. /*    ↓↓                        ★★ DEBUG ★★                        ↓↓    */
  1403.         if ( CDDA_DEBUG ) {
  1404.             printf( "<SW_CHECK> " ) ;
  1405.             printf( "no = %d , %d 曲目 , musicno = %d\n",
  1406.                     no,CDDA_COUNT_program,CDDA_NOW_musicno ) ;
  1407.         }
  1408. /*    ↑↑                        ★★ DEBUG ★★                        ↑↑    */
  1409.         dispselectmusicno( CDDA_NOW_musicno ) ;
  1410.         disptime( CDDA_NOW_musicno,Timemode ) ;
  1411.         TAPE_check() ;
  1412.         dispprogramtime() ;
  1413.         break ;
  1414.     case SW_CLEAR :
  1415.         nowmusic = CDDA_NOW_musicno ;
  1416.         /*    ●● CLEAR SWITCH ON ●●    */
  1417.         no = CDDA_switch( CDDA_SW_PRG_CLEAR ) ;
  1418.         if ( no > ZERO ) {
  1419.             Timemode = TM_TR_CLOCK ;
  1420.             Prginf[no-1] -- ;
  1421.             Prgcnt[no-1] -- ;
  1422.             if ( Prginf[no-1] <= ZERO ) {
  1423.                 dispmusicno( no,FALSE ) ;
  1424.             }
  1425.             Flg.prgchk = TRUE ;
  1426.             dispselectmusicno( CDDA_NOW_musicno ) ;
  1427.             disptime( CDDA_NOW_musicno,Timemode ) ;
  1428. /*-----------------------------------------------------------------------------
  1429. **    status取得後の曲番号変化時に Prginf が デクリメント されるのを防ぐために、ここ
  1430. **    で、Flg.playon を TRUE にしておく. (ただし、演奏中の曲を削除した時)
  1431. -----------------------------------------------------------------------------*/
  1432.             if ( CDDA_NOW_status == CDDA_STAT_PLAY ||
  1433.                     CDDA_NOW_status == CDDA_STAT_PAUSE ) {
  1434.                 if ( no == nowmusic ) Flg.playon = TRUE ;
  1435.             }
  1436. /*-----------------------------------------------------------------------------
  1437. **    演奏中(PAUSE中含)最後の曲を削除した場合には、テープ選択処理をクリアする.
  1438. -----------------------------------------------------------------------------*/
  1439.             if ( !CDDA_TOTAL_program ) {
  1440.                 Flg.tape = FALSE ;
  1441.                 dispmsgclear() ;
  1442.             }
  1443.             TAPE_check() ;
  1444.             dispprogramtime() ;
  1445.         }
  1446.     }
  1447. }
  1448.  
  1449. /******************************  電子ボリューム処理  *****************************/
  1450. void selectelevol( void )
  1451. /*=============================================================================
  1452. **    電子ボリュームの操作を行う.
  1453. **
  1454. **    < INPUT  > : なし
  1455. **    < OUTPUT > : なし
  1456. **    < RETURN > : なし
  1457. **
  1458. **    マウスは呼び側でOFFにしておいて下さい.
  1459. =============================================================================*/
  1460. {
  1461.     int        mbot, mx, my ;
  1462.     int        vol ;
  1463.  
  1464. /*-----------------------------------------------------------------------------
  1465. **    MUTE の ON/OFF は、マウスサポートなし.
  1466. -----------------------------------------------------------------------------*/
  1467.     Flg.mute = FALSE ;
  1468.     ELEVOL_set( ELEVOL_CD,Evol+1,Evol+1 ) ;                    /*  CD        */
  1469.     while ( TRUE ) {
  1470.         MOS_rdpos( &mbot,&mx,&my ) ;
  1471.         if ( mbot != MOS_LEFT ) break ;
  1472.         if ( mx < Position[SW_ELEVOL].s.x ) {                /*  MIN        */
  1473.             Evol = ELEVOL_MIN ;
  1474.         } else if ( mx > Position[SW_ELEVOL].e.x ) {        /*  MAX        */
  1475.             Evol = ELEVOL_MAX ;
  1476.         } else {                                            /*  VAL        */
  1477.             vol  = ( mx - Position[SW_ELEVOL].s.x ) / 3 ;
  1478.             Evol = ( vol + 2 ) * 4 ;
  1479.         }
  1480.         dispelevol() ;
  1481.         ELEVOL_set( ELEVOL_CD,Evol+1,Evol+1 ) ;                /*  CD        */
  1482.     } ;
  1483.     mosloop( MOS_LEFT,&mbot,&mx,&my ) ;
  1484. }
  1485.  
  1486. /******************************  イベント情報表示  ******************************/
  1487. void debugevent( int evno )
  1488. /*=============================================================================
  1489. **    イベントの選択状態を標準出力する.
  1490. **
  1491. **    < INPUT  > : イベントスイッチ
  1492. **    < OUTPUT > : なし
  1493. **    < RETURN > : なし
  1494. =============================================================================*/
  1495. {
  1496.     if ( !CDDA_DEBUG ) return ;
  1497.  
  1498.     printf( "<event> switch on : " ) ;
  1499.     if ( evno >= SWVAL ) {
  1500.         switch ( evno-SWVAL ) {
  1501.         case SW_EXIT :
  1502.             printf( "EXIT\n" ) ;
  1503.             break ;
  1504.         case SW_TIME :
  1505.             printf( "TIME\n" ) ;
  1506.             break ;
  1507.         case SW_REPEAT :
  1508.             printf( "REPEAT\n" ) ;
  1509.             break ;
  1510.         case SW_CHECK :
  1511.             printf( "CHECK\n" ) ;
  1512.             break ;
  1513.         case SW_CLEAR :
  1514.             printf( "CLEAR\n" ) ;
  1515.             break ;
  1516.         case SW_STOP :
  1517.             printf( "STOP\n" ) ;
  1518.             break ;
  1519.         case SW_PAUSE :
  1520.             printf( "PAUSE\n" ) ;
  1521.             break ;
  1522.         case SW_SHUFFLE :
  1523.             printf( "SHUFFLE\n" ) ;
  1524.             break ;
  1525.         case SW_PLAY :
  1526.             printf( "PLAY\n" ) ;
  1527.             break ;
  1528.         case SW_REWMUSIC :
  1529.             printf( "REW MUSIC\n" ) ;
  1530.             break ;
  1531.         case SW_REWTIME :
  1532.             printf( "REW TIME\n" ) ;
  1533.             break ;
  1534.         case SW_FFTIME :
  1535.             printf( "FF TIME\n" ) ;
  1536.             break ;
  1537.         case SW_FFMUSIC :
  1538.             printf( "FF MUSIC\n" ) ;
  1539.             break ;
  1540.         case SW_PROGRAM :
  1541.             printf( "PROGRAM\n" ) ;
  1542.             break ;
  1543.         case SW_SINGLE :
  1544.             printf( "SINGLE\n" ) ;
  1545.             break ;
  1546.         case SW_CONTINUE :
  1547.             printf( "CONTINUE\n" ) ;
  1548.             break ;
  1549.         case SW_ELEVOL :
  1550.             printf( "ELEVOL\n" ) ;
  1551.             break ;
  1552.         }
  1553.     } else {
  1554.         printf( "曲番号 %d\n",evno ) ;
  1555.     }
  1556. }
  1557.  
  1558. /********************************  イベント処理  ********************************/
  1559. int event( void )
  1560. /*=============================================================================
  1561. **    指定された処理を行う.
  1562. **
  1563. **    < INPUT  > : なし
  1564. **    < OUTPUT > : なし
  1565. **    < RETURN > : 終了の時 真値, それ以外は 偽値.
  1566. =============================================================================*/
  1567. {
  1568.     int        evno ;
  1569.     int        mbot, mx, my ;
  1570.  
  1571.     if ( mosevent( &evno ) ) {
  1572.  
  1573. /*    ↓↓                        ★★ DEBUG ★★                        ↓↓    */
  1574.         if ( CDDA_DEBUG ) {
  1575.             debugevent( evno ) ;
  1576.         }
  1577. /*    ↑↑                        ★★ DEBUG ★★                        ↑↑    */
  1578.  
  1579. /*
  1580. **    スイッチ操作あり
  1581. */
  1582.         if ( CDDA_NOW_status == CDDA_STAT_STOP ||
  1583.                 CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
  1584.             Noaflg = TRUE ;
  1585.             SNDPLAY_stop( STOP_CH ) ;
  1586.             Tcount3 = NOA_WAIT + 1 ;
  1587.         }
  1588.         dispmouse( FALSE ) ;
  1589. /*-----------------------------------------------------------------------------
  1590. **    evno が SWVALより大きな時には、演奏スイッチの処理である.
  1591. -----------------------------------------------------------------------------*/
  1592.         if ( evno >= SWVAL ) {
  1593. /*-----------------------------------------------------------------------------
  1594. **    EXIT / TIME / REPEAT / ELEVOL 処理
  1595. -----------------------------------------------------------------------------*/
  1596.             switch ( evno-SWVAL ) {
  1597.             case SW_EXIT :
  1598.                 SNDPLAY_play( EXIT_CH,EXIT_SND ) ;
  1599.                 /*    ●● EJECT SWITCH ON ●●    */
  1600.                 CDDA_switch( CDDA_SW_EXIT ) ;
  1601.                 dispevent( evno,FALSE ) ;
  1602.                 return( TRUE ) ;
  1603.             case SW_TIME :
  1604.                 if ( CDDA_NOW_status != CDDA_STAT_PLAY &&
  1605.                         CDDA_NOW_status != CDDA_STAT_PAUSE ) break ;
  1606.                 switch ( Timemode ) {
  1607.                 case TM_TR_CLOCK :
  1608.                     Timemode = TM_TR_TIME ;
  1609.                     break ;
  1610.                 case TM_TR_TIME :
  1611.                     Timemode = TM_DISC_CLOCK ;
  1612.                     break ;
  1613.                 case TM_DISC_CLOCK :
  1614.                     Timemode = TM_DISC_TIME ;
  1615.                     break ;
  1616.                 case TM_DISC_TIME :
  1617.                     Timemode = TM_TR_CLOCK ;
  1618.                     break ;
  1619.                 default :
  1620.                     Timemode = TM_TR_CLOCK ;
  1621.                 }
  1622. /*-----------------------------------------------------------------------------
  1623. **    Flg.prgchk が真値だと、時間表示されないので、FALSEにし待ち時間をクリアする.
  1624. -----------------------------------------------------------------------------*/
  1625.                 Flg.prgchk = FALSE ;
  1626.                 Tcount2 = PRG_WAIT + 1 ;
  1627.                 disptime( CDDA_NOW_musicno,Timemode ) ;
  1628.                 break ;
  1629.             case SW_REPEAT :
  1630.                 if ( Flg.repeat ) {
  1631.                     Flg.repeat = FALSE ;
  1632.                 } else {
  1633.                     Flg.repeat = TRUE ;
  1634.                 }
  1635.                 /*    ●● REPEAT SWITCH ON/OFF ●●    */
  1636.                 CDDA_switch( CDDA_SW_REPEAT ) ;
  1637.                 disprepeat( Flg.repeat ) ;
  1638.                 break ;
  1639.             case SW_ELEVOL :
  1640.                 selectelevol() ;
  1641.                 break ;
  1642.             }
  1643. /*-----------------------------------------------------------------------------
  1644. **    CHECK/CLEAR / STOP / PAUSE / SHUFFLE / PLAY / FF/REW / MODEスイッチ 処理
  1645. -----------------------------------------------------------------------------*/
  1646.             switch ( evno-SWVAL ) {
  1647.             case SW_CHECK :
  1648.             case SW_CLEAR :
  1649.                 selectprogramsw( evno-SWVAL ) ;
  1650.                 break ;
  1651.             case SW_STOP :
  1652.             case SW_PAUSE :
  1653.                 selectstop( evno-SWVAL ) ;
  1654.                 break ;
  1655.             case SW_SHUFFLE :
  1656.             case SW_PLAY :
  1657.                 selectplay( evno-SWVAL ) ;
  1658.                 break ;
  1659.             case SW_REWMUSIC :
  1660.             case SW_REWTIME :
  1661.             case SW_FFTIME :
  1662.             case SW_FFMUSIC :
  1663.                 selectffrew( evno-SWVAL ) ;
  1664.                 break ;
  1665.             case SW_PROGRAM :
  1666.             case SW_SINGLE :
  1667.             case SW_CONTINUE :
  1668.                 selectmode( evno-SWVAL ) ;
  1669.             }
  1670. /*-----------------------------------------------------------------------------
  1671. **    曲番号指定時の処理
  1672. -----------------------------------------------------------------------------*/
  1673.         } else {
  1674.             selectmusic( evno ) ;
  1675.         }
  1676. /*-----------------------------------------------------------------------------
  1677. **    一つの指定された処理を終了させるために マウス の開放を待つ.
  1678. **    ( 次の マウス 処理に備える )
  1679. -----------------------------------------------------------------------------*/
  1680.         mosloop( MOS_LEFT,&mbot,&mx,&my ) ;        /*  マウスの開放を待つ            */
  1681.         dispmouse( TRUE ) ;
  1682.     }
  1683.     return( FALSE ) ;
  1684. }
  1685.  
  1686. /******************************  CD演奏処理開始  *****************************/
  1687. void start( void )
  1688. /*=============================================================================
  1689. **    CD PLAYER の機能を実行する.
  1690. **
  1691. **    < INPUT  > : なし
  1692. **    < OUTPUT > : なし
  1693. **    < RETURN > : なし
  1694. =============================================================================*/
  1695. {
  1696.     int        c ;
  1697.     char    *opening = "しばらくお待ちください...." ;
  1698.     char    *err = "メモリが足りません...." ;
  1699.  
  1700. /*    マウス消去        */
  1701.     dispmouse( FALSE ) ;
  1702.  
  1703. /*-----------------------------------------------------------------------------
  1704. **    オープニングメッセージ表示
  1705. -----------------------------------------------------------------------------*/
  1706.     EGB_color( Gwork,0,COLOR_TITLE ) ;
  1707.     EGB_color( Gwork,1,COLOR_TITLE_BACK ) ;
  1708.     EGB_paintMode( Gwork,0x02 ) ;
  1709.     EGB_writeMode( Gwork,PSET ) ;
  1710.     EGB_fontStyle( Gwork,0x0005 ) ;                /*  影付&太文字                */
  1711.     c = ( 80 - strlen( opening ) ) / 2 * XCDOT ;
  1712.     disptext( Gwork,c,239,opening ) ;
  1713.     EGB_fontStyle( Gwork,0x0000 ) ;                /*  通常文字                */
  1714.  
  1715. /*-----------------------------------------------------------------------------
  1716. **    CD 初期処理
  1717. -----------------------------------------------------------------------------*/
  1718.     /*    ●● 初期処理指定 ●●    */
  1719.     disperrormsg( CDDA_switch( CDDA_SW_INIT ) ) ;
  1720.     Status = CDDA_NOW_status ;
  1721.  
  1722. /*-----------------------------------------------------------------------------
  1723. **    仮想ページを設定し、描く.(描いている過程を画面に表示しないため)
  1724. -----------------------------------------------------------------------------*/
  1725.     Wpagebuf = malloc( 640*240 ) ;
  1726.     if ( Wpagebuf == NULL ) {
  1727.         EGB_color( Gwork,0,COLOR_ERROR ) ;
  1728.         EGB_color( Gwork,1,COLOR_TITLE_BACK ) ;
  1729.         EGB_paintMode( Gwork,0x02 ) ;
  1730.         EGB_writeMode( Gwork,PSET ) ;
  1731.         EGB_fontStyle( Gwork,0x0005 ) ;            /*  影付&太文字                */
  1732.         c = ( 80 - strlen( err ) ) / 2 * XCDOT ;
  1733.         disptext( Gwork,c,239,err ) ;
  1734.         EGB_fontStyle( Gwork,0x0000 ) ;            /*  通常文字                */
  1735.         return ;
  1736.     }
  1737.     EGB_resolutionRam( Gwork,WPAGE,4,640,480,Wpagebuf ) ;
  1738.     EGB_writePage( Gwork,WPAGE ) ;
  1739.     EGB_color( Gwork,1,COLOR_SCREEN_BACK ) ;
  1740.     EGB_clearScreen( Gwork ) ;
  1741.  
  1742. /*-----------------------------------------------------------------------------
  1743. **    画面表示
  1744. -----------------------------------------------------------------------------*/
  1745.     disptitle() ;
  1746.     dispswitch() ;
  1747.     disptoc( TRUE ) ;
  1748.     if ( Status == CDDA_STAT_PLAY ) {            /*  演奏中だった場合        */
  1749.         dispplay( TRUE ) ;
  1750.         for ( c=1; c<CDDA_NOW_musicno; c++ ) dispmusicno( c,FALSE ) ;
  1751.     } else {
  1752.         /*    ●● PLAY SWITCH ON ●●    */
  1753.         if ( Startplay ) disperrormsg( CDDA_switch( CDDA_SW_PLAY ) ) ;
  1754.     }
  1755.     EGB_writePage( Gwork,1 ) ;
  1756.     put( Gwork,0,0,639,479,(unsigned int)Wpagebuf,4 ) ;
  1757.     free( Wpagebuf ) ;
  1758.  
  1759. /*    マウス表示        */
  1760.     if ( CDDA_NOW_status == CDDA_STAT_NOTREADY ) {
  1761.         MOS_horizon( Position[SW_EXIT].s.x,Position[SW_EXIT].e.x ) ;
  1762.         MOS_vertical( Position[SW_EXIT].s.y,Position[SW_EXIT].e.y ) ;
  1763.         mossetpos( SW_EXIT+SWVAL ) ;
  1764.     } else {
  1765.         MOS_horizon( 0,639 ) ;
  1766.         MOS_vertical( 0,479 ) ;
  1767.         mossetpos( SW_PLAY+SWVAL ) ;
  1768.     }
  1769.     dispmouse( TRUE ) ;
  1770.  
  1771. /*-----------------------------------------------------------------------------
  1772. **    COMPACT DISC PLAYER
  1773. -----------------------------------------------------------------------------*/
  1774.     timer_init() ;                                /*  タイマ割り込み登録            */
  1775.     Tcount1 = CDC_WAIT + 1 ;
  1776.     Tcount2 = PRG_WAIT + 1 ;
  1777.     Tcount3 = ZERO ;
  1778.     while ( TRUE ) {
  1779.         if ( (Tcount1 > CDC_WAIT) ||
  1780.                 (CDDA_NOW_status == CDDA_STAT_NOTREADY) ) {
  1781.             checkstatus() ;
  1782.             Tcount1 = 0 ;
  1783.         }
  1784.         if ( Tcount1 < 0 ) Tcount1 = CDC_WAIT + 1 ;
  1785.         if ( Tcount2 < 0 ) Tcount2 = PRG_WAIT + 1 ;
  1786.         if ( Tcount3 < 0 ) Tcount3 = NOA_WAIT + 1 ;
  1787.         if ( event() ) break ;
  1788.         if ( KEY_event() ) break ;
  1789.     } ;
  1790.     timer_end() ;                                /*  タイマ割り込み終了            */
  1791.     KYB_clrbuf() ;
  1792. }
  1793.  
  1794. /*****************************  CD演奏ライブラリ試験  ****************************/
  1795. int main( int ac,char *av[] )
  1796. /*=============================================================================
  1797. **    MAIN ルーチン
  1798. **
  1799. **    < INPUT  > : 起動時コマンドライン
  1800. **    < OUTPUT > : なし
  1801. **    < RETURN > : 通常は 0 , オプションスイッチエラーの時は、1
  1802. =============================================================================*/
  1803. {
  1804.     char    cons, err ;
  1805.     int        c, cc, arglen ;
  1806.     extern coninit() ;
  1807.  
  1808. /*-----------------------------------------------------------------------------
  1809. **    引数(オプションスイッチ)の処理を行う.
  1810. **    誤ったオプションが指定された場合には、プログラムを強制終了する.
  1811. -----------------------------------------------------------------------------*/
  1812.     cons = FALSE ;
  1813.     err  = FALSE ;
  1814.     if ( ac > 1 ) {                                        /*  引数解析    */
  1815.         for ( c=1; c<ac; c++ ) {
  1816.             if ( *av[c] == '-' || *av[c] == '/' ) {        /* オプションスイッチ    */
  1817.                 arglen = strlen( av[c] ) ;
  1818.                 for ( cc=1; cc<arglen; cc++ ) {
  1819.                     switch ( *(av[c]+cc) ) {
  1820.                     case '/' :
  1821.                     case '-' :
  1822.                         break ;
  1823.                     case 'c' :
  1824.                     case 'C' :
  1825.                         cons = TRUE ;
  1826.                         break ;
  1827.                     case 'p' :
  1828.                     case 'P' :
  1829.                         Startplay = TRUE ;
  1830.                         break ;
  1831.                     case 's' :
  1832.                     case 'S' :
  1833.                         CDDA_FLG_stop = FALSE ;
  1834.                         break ;
  1835.                     case 'd' :
  1836.                     case 'D' :
  1837.                         CDDA_DEBUG = TRUE ;
  1838.                         break ;
  1839.                     default :
  1840.                         printf("\x1b[33m") ;
  1841.                         printf("Option switch error: %c",*(av[c]+cc)) ;
  1842.                         printf("\x1b[m\n") ;
  1843.                         err = TRUE ;
  1844.                     }
  1845.                 }
  1846.             } else {
  1847.                 printf("\x1b[31m") ;
  1848.                 printf("Parameter error: %s",av[c]) ;
  1849.                 printf("\x1b[m\n") ;
  1850.                 err = TRUE ;
  1851.             }
  1852.         }
  1853.     }
  1854.     if ( err ) exit( TRUE ) ;
  1855.  
  1856. /*-----------------------------------------------------------------------------
  1857. **    INT23h(CTRL+C)とINT24(CRITICAL ERROR) の マスク をする.
  1858. -----------------------------------------------------------------------------*/
  1859.     int24_mask() ;
  1860.  
  1861. /*-----------------------------------------------------------------------------
  1862. **    CD PLAYER 処理の開始
  1863. -----------------------------------------------------------------------------*/
  1864.     init() ;                                    /*  初期化                    */
  1865.     start() ;
  1866.  
  1867. /*-----------------------------------------------------------------------------
  1868. **    CD PLAYER 処理の終了
  1869. -----------------------------------------------------------------------------*/
  1870.     MOS_end() ;                                    /*  マウス終了                    */
  1871.     while ( TRUE ) {
  1872.         if ( !SND_pcm_status( EXIT_CH ) ) break ;
  1873.         MOS_rdpos( &Mosbot,&Mosx,&Mosy ) ;
  1874.         if ( Mosbot ) break ;
  1875.     }
  1876.     SNDPLAY_stop( EXIT_CH ) ;
  1877.     SND_end() ;                                    /*  サウンド終了                */
  1878.  
  1879. /*-----------------------------------------------------------------------------
  1880. **    音の終了処理
  1881. -----------------------------------------------------------------------------*/
  1882.     if ( !CDDA_FLG_stop ) ELEVOL_set( ELEVOL_CD,Evol+1,Evol+1 ) ;
  1883.     else                  ELEVOL_mute() ;
  1884.  
  1885. /*-----------------------------------------------------------------------------
  1886. **    コンソール画面に戻す
  1887. -----------------------------------------------------------------------------*/
  1888.     if ( cons ) {
  1889.         EGB_init( Gwork,GworkSize ) ;    /*  ゴミを消すため EGB 初期化        */
  1890.         EGB_clearScreen( Gwork ) ;
  1891.         coninit() ;
  1892.     }
  1893.  
  1894.     return( ZERO ) ;
  1895. }
  1896.  
  1897.